﻿using Microsoft.CodeAnalysis;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Terraria;
using Terraria.GameContent;
using Terraria.ID;
using Terraria.ModLoader;

namespace EAMF.Content.Projectiles
{
    public class NanoBullet : ModProjectile
    {
        public override void SetStaticDefaults()
        {
            Main.projFrames[Type] = 1; //设置帧数
            ProjectileID.Sets.TrailingMode[Type] = 2;//这项复制为2可以记录运动轨迹和方向(方便做拖尾)
            ProjectileID.Sets.TrailCacheLength[Type] = 10;//这项代表记录可以追溯到多少帧之前
            ProjectileID.Sets.DrawScreenCheckFluff[Type] = 2000;//这项代表超过平面外多少可以进行绘制
                                                                //用长条状进行绘制
            base.SetStaticDefaults();
        }
        public override void SetDefaults()
        {
            Projectile.width = 2; //设置碰撞体积
            Projectile.height = 2;
            Projectile.alpha = 0;//透明度
            Projectile.timeLeft = 150; //存活时间
            Projectile.penetrate = -1; //穿透次数
            Projectile.friendly = false; //是否是友方弹幕 true表示是
            Projectile.hostile = true; //是否是敌方弹幕 true表示是
            Projectile.tileCollide = true; //是否会创死
            Projectile.ignoreWater = true; //是否穿透水源
            Projectile.netImportant = true; //??
            Projectile.aiStyle = -1;//是否使用原版ai,-1表示使用，默认为-1
            CooldownSlot = ImmunityCooldownID.Bosses; //使用boss的独立受击无敌时间

            base.SetDefaults();
        }

        public override bool PreDraw(ref Color lightColor) //predraw返回false即可禁用原版绘制
        {
            //手动绘制帧图
            //设置选框
            Texture2D texture = TextureAssets.Projectile[Type].Value; //声明本弹幕的材质,texture代表整个帧图
            Rectangle rectangle = new Rectangle( //手动绘制需要填写自己的帧图框,所以需要计算该框的大小
                0, //这个框左上角的水平坐标,代表从帧图上哪个位置开始抠图
                texture.Height / Main.projFrames[Type] * Projectile.frame, //框左上角的纵坐标
                texture.Width, //框的宽度
                texture.Height / Main.projFrames[Type] //框的高度,材质的高度除以帧数便可以得到
            );

            //制作拖尾，首先需要建立一个for循环语句，从0一直走到轨迹末端
            for (int i = ProjectileID.Sets.TrailCacheLength[Type] - 1; i >= 0; i--) //循环上限小于轨迹长度,这里代表的是缓存长度
            {
                float factor = 1 - (float)i / ProjectileID.Sets.TrailCacheLength[Type];
                //定义一个从新到旧由1减少到0的变量，这里的factor从1-0.9-0.8-。。-0的变化
                Vector2 oldcenter = Projectile.oldPos[i] - Main.screenPosition + Projectile.Size / 2;
                //这里也要减去Main.screenPosition，因为Projectile.oldPos是相对世界的位置
                //轨迹只记录弹幕碰撞想左上角的位置，我们要手动加上弹幕宽高的一半来获取中心
                //绘制残影
                Main.EntitySpriteDraw(texture, oldcenter, rectangle, lightColor * factor, //颜色逐渐变浅趋近于0
                    Projectile.oldRot[i],//
                    new Vector2(texture.Width / 2, texture.Height / Main.projFrames[Type] / 2),
                    new Vector2(1, 1),
                    Projectile.direction == 1 ? SpriteEffects.None : SpriteEffects.FlipHorizontally,
                   0
                   );
            }
            //由于tr绘制是先执行的先绘制，所以想要残影不覆盖到本体上面，就先写残影绘制

            //开始绘制
            Main.EntitySpriteDraw( //EntitySpriteDraw是弹幕和NPC的常用绘制方法
                texture,//材质
                Projectile.Center - Main.screenPosition,//绘制的时候是以屏幕左上角为0点进行绘制的,这里要填相对屏幕的坐标
                                                        //因此要使用弹幕的世界坐标减去屏幕左上角的世界坐标得到与屏幕的相对坐标
                rectangle, //帧图选框
                lightColor, //第四个参数是颜色，这里自带的是lightColor，可受到自然光照的影响
                Projectile.rotation, //第五个是贴图的旋转方向
                new Vector2(texture.Width / 2, texture.Height / Main.projFrames[Type] / 2),
                //第六个参数是贴图参照原点的坐标，这里我们将参照的坐标调整为单帧的中心位置，这样旋转和缩放都是围绕中心
                new Vector2(1, 1),//第七个参数是缩放，x是水平倍率，Y是竖直倍率
                Projectile.direction == 1 ? SpriteEffects.None : SpriteEffects.FlipHorizontally,
                //第八个参数是图片的翻转效果，需要手动判定并设置SpriteEffects ,如果是1则不翻
                0//第九个参数是设置绘制层级，填0就行
            );
            //绘制残影
            return false; //false阻止自动绘制
            //return base.PreDraw(ref lightColor);

        }
        public override void AI()
        {
            Projectile.rotation = Projectile.velocity.ToRotation(); //让弹幕方向转向速度方向
                                                                    //如果贴图方向不是朝右需要修正弧度

            //调用自动绘制时，原版给你一些字段控制贴图的表现
            //水平反转，某些弹幕旋转后表现奇怪，或需要保持姿态，此时需要水平反转加上半个元
            if (Projectile.velocity.X > 0)
            {
                //如果弹幕速度朝向右边
                //因为方向默认是右边的所以不需要反转，默认值也是1
                Projectile.direction = Projectile.spriteDirection = 1;//默认是1所以不反转,direction代表方向
            }
            else
            {
                Projectile.direction = Projectile.spriteDirection = -1;//进行水平反转
                Projectile.rotation += 3.1415f;//旋转半圆
            }

            base.AI();
        }
    }
}
